Skip to content

feat(blob): blob storage coordinator + upload-policy cache#1111

Merged
bmc08gt merged 4 commits into
code/cashfrom
feat/blob-storage-coordinator
Jul 21, 2026
Merged

feat(blob): blob storage coordinator + upload-policy cache#1111
bmc08gt merged 4 commits into
code/cashfrom
feat/blob-storage-coordinator

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Stacked PR 3/5 — base: feat/type-aware-dm-feed

App-layer coordinator over the services blob client (from #1109), following the Coordinator pattern used across the app so ViewModels depend on the coordinator rather than the controller.

What

  • New :apps:flipcash:shared:blob module with BlobStorageCoordinator.
  • Owns a DataStore-backed upload-policy cache; exposes policy as a self-refreshing Flow (TTL + version invalidation), plus preloadPolicy() and upload().
  • Session controller preloads the policy once the user is registered, so photo selection can filter/validate locally without a round-trip.

Tests

  • BlobStorageCoordinatorTest (TTL, version invalidation, refresh dedupe).

bmc08gt added 3 commits July 21, 2026 18:46
Adds the client wrapper for the BlobStorage gRPC service (direct-to-storage
presigned uploads): Api/Service/Repository/Controller, an HTTP BlobUploader,
the UploadTarget/UploadPolicy domain models + proto converters, error types,
and DI wiring. BlobStorageController.upload() coordinates the full handshake
(reserve -> PUT/POST -> complete -> poll until READY) behind one call, and
getUploadPolicy() exposes the accepted MIME/size constraints.

Covered by UploadPolicyTest and BlobStorageControllerTest.

Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
Makes the shared chat FeedOperations type-aware: feed(chatType) and
observeUnreadConversations(chatType) now take a required ChatType, and the
sync delegate merges the CONTACT_DM and TIP_DM feeds while only applying the
contact identity-drop to CONTACT_DM. Send flow consumes feed(CONTACT_DM); the
contact list carries a ConversationReference instead of a raw Conversation.

Session/nav rename the generic notificationUnreadCount to contactDmUnreadCount
now that unread is tracked per chat type.

Covered by FeedSyncCombinedFeedTest.

Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
Adds the app-layer BlobStorageCoordinator (new :apps:flipcash:shared:blob
module) wrapping BlobStorageController. It owns a DataStore-backed upload-policy
cache, exposes policy as a self-refreshing Flow (TTL + version invalidation),
and offers preloadPolicy()/upload(). The session controller preloads the
policy once the user is registered so photo selection can filter/validate
locally without a round-trip.

Covered by BlobStorageCoordinatorTest.

Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
@github-actions github-actions Bot added type: feature New functionality area: build-system Gradle, convention plugins, build-logic area: session labels Jul 21, 2026
Base automatically changed from feat/type-aware-dm-feed to code/cash July 21, 2026 23:11
@bmc08gt
bmc08gt merged commit 5ae1154 into code/cash Jul 21, 2026
2 checks passed
@bmc08gt
bmc08gt deleted the feat/blob-storage-coordinator branch July 21, 2026 23:12
bmc08gt added a commit that referenced this pull request Jul 21, 2026
* feat(opencode): bring back Kind.Tip on OpenCodePayload

Ports the legacy CodePayload tip layout onto OpenCodePayload. The payload value
becomes polymorphic (PayloadValue): Cash/MultiMintCash carry a Fiat as before,
Tip carries a Username. Fiat now implements PayloadValue, so existing call sites
are unaffected and the Cash/MultiMintCash wire format is unchanged.

Tip encoding follows the shipped legacy scheme: the username is written at
OFFSET_USERNAME and short usernames are padded with '.' + base64(SHA256(username))
out to 15 bytes; decode recovers the username by stripping at the '.' delimiter.
GrabBillTransactor rejects Tip as non-grabbable; CodeScanDelegate routes Tip off
the cash path (tip-scan handling is a follow-up).

Covered by OpenCodePayloadTests tip round-trips.

Signed-off-by: Brandon McAnsh <git@bmcreations.dev>

* test(session): fix RealSessionController construction after blobStorageCoordinator

RealSessionController gained a blobStorageCoordinator constructor param (#1111)
but these two direct-construction tests were not updated, leaving the session
unit-test source uncompilable on trunk. Pass a relaxed mock like the other
coordinators.

Signed-off-by: Brandon McAnsh <git@bmcreations.dev>

---------

Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: build-system Gradle, convention plugins, build-logic area: session type: feature New functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant